/**
 * 
 */
package ar.utn.frgp.banco.dao.impl;

import genericos.dao.exeptions.PersistanceException;
import genericos.dao.exeptions.PersistenceServiceException;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import ar.utn.frgp.banco.dao.ClientesDAO;
import ar.utn.frgp.banco.dao.EBAbstractDAO;
import ar.utn.frgp.banco.entity.Cliente;
import ar.utn.frgp.banco.exceptions.DataAccessException;
import ar.utn.frgp.banco.exceptions.PersonalisedException;

/**
 * @author PUSDERKIS
 *
 */
public class ClientesDAOImpl extends EBAbstractDAO implements ClientesDAO {

	/**
	 * 
	 * @throws PersonalisedException en caso de error.
	 * @see ar.utn.frgp.banco.dao.ClientesDAO#getCliente(java.lang.String)
	 */
	public Cliente getCliente(String dni) throws DataAccessException {
		
		String sQuery="FROM Cliente c WHERE c.dni = :dni ";
		
		
		
		try{
			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery);
			
			query.setString("dni", dni);
			
			return (Cliente)query.uniqueResult();
			
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar el cliente con dni: "+dni,e);
			throw new DataAccessException("Error al recuperar el cliente con dni: "+dni, e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar el cliente con dni: "+dni,e);
			throw new DataAccessException("Error al recuperar el cliente con dni: "+dni, e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new DataAccessException("Error al recuperar la lista de rubros", e);
		}
		
	}

	public void altaCliente(Cliente cliente) throws DataAccessException {

		universalHibernateDAO.save(cliente);
		
	}

	
	@SuppressWarnings("unchecked")
	public List<Cliente> obtenerClientes() throws DataAccessException {

		String sQuery="FROM Cliente";
		
		try {
			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery);
			List<Cliente> clientes = query.list();
			return clientes;
			
		} catch (HibernateException e) {
			logger.error("Error al recuperar lista de clientes: ",e);
			throw new DataAccessException("Error al recuperar lista de clientes: ",e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar lista de clientes: ",e);
			throw new DataAccessException("Error al recuperar lista de clientes: ",e);
		}
	}
	//Este metodo es igual a getCliente(dni)
	public Cliente obtenerCliente(String dni) throws DataAccessException,
			PersonalisedException {
			
		return getCliente(dni);
	}
}
